/*
 * qc slave mode data control.
 * Copyright (c) 2012  everyone
 * All rights reserved.
 * no limite
 */
#include "qcom.h"
#include "app\sys_task.h"

uu16 hdat[16];
/*******************************************************************************
 * @brief  reg_hold_read
 * \param[in] Index : data address
 * @return  data
 * @ Pass/ Fail criteria: none
 *****************************************************************************/
uint16_t qc_reg_get(uint16_t Index)
{
	word_tt Val;
	Val.uval = 0;

	hdat[4]++;

	if (Index < 16)
	{
		Val.uval = hdat[Index];
	}
	else
	{
		if (rang_check(Index, 60000, 60099))
		{
			Gst.dbg.dat.ctr.cmd.link_cnt++;
			Val.uval = Gst.dbg.dat.ctr.dat[Index - 60000];
		}
	}
	return Val.uVal;
}

/*******************************************************************************
 * @brief  reg_hold_write
 * \param[in] Index : data address
 * \param[in] Val : data
 * @return  data
 * @ Pass/ Fail criteria: none
 *******************************************************************************/
void qc_reg_set(uint16_t Index, uint16_t Val)
{
	if (Index < 16)
	{
		hdat[Index] = Val;
	}

	if (rang_check(Index, 60000, 60099))
	{
		switch (Index)
		{
		case 60000:
			Gst.dbg.dat.ctr.dat[0] = Val;
			break;
		case 60001:
			Gst.dbg.dat.ctr.dat[1] = Val;
			if ((Gst.dbg.dat.ctr.dat[7] + Gst.dbg.dat.ctr.dat[8] * Gst.dbg.dat.ctr.dat[9] * 13 == Gst.dbg.dat.ctr.dat[0]) && (Gst.dbg.dat.ctr.dat[7] * Gst.dbg.dat.ctr.dat[8] * 17 + Gst.dbg.dat.ctr.dat[9] == Gst.dbg.dat.ctr.dat[1]))
			{
				Gst.dbg.st = 1;
			}
			else
			{
				Gst.dbg.st = 0;
			}
			break;
		case 60002:
		{
			int ch, cmd;

			if (!Gst.dbg.st)
				break;

			ch = Val >> 8;
			cmd = Val & 0xFF;

			// 标定操作
			if (ch < 8)
			{
				switch (cmd)
				{
				case 0x11:
					Gst.dbg.dat.mark[ch * 3 + 0] = Gst.dbg.dat.ain[ch];
					break;
				case 0x22:
					Gst.dbg.dat.mark[ch * 3 + 1] = Gst.dbg.dat.ain[ch];
					break;
				case 0x33:
					Gst.dbg.dat.mark[ch * 3 + 2] = Gst.dbg.dat.ain[ch];
					break;
				}
			}
			break;
		}
		default:
			if (!Gst.dbg.st)
				break;
			// 输出值
			if (rang_check(Index, 60020, 60029))
			{
				Gst.dbg.dat.dout[Index - 60020] = Val;
			}
			else if (rang_check(Index, 60040, 60049))
			{
				Gst.dbg.dat.aout[Index - 60040] = Val;
			}
			break;
		}
	}
}

/*******************************************************************************
 * @brief  reg_coil_write
 * \param[in] Index : data address
 * \param[in] Val : data
 * @return  data
 * @ Pass/ Fail criteria: none
 *******************************************************************************/
uu8 coil_reg[16];

void qc_coil_dat_set(uu16 Bindex, uu8 dat)
{
	if (Bindex < 16)
		coil_reg[Bindex] = dat;
}

/*******************************************************************************
 * @brief  reg_coil_read
 * \param[in] Index : data address
 * @return  data
 * @ Pass/ Fail criteria: none
 *****************************************************************************/
uu8 qc_coil_dat_get(uu16 Bindex)
{
	if (Bindex < 16)
		return coil_reg[Bindex];
	else
		return 0;
}
